home *** CD-ROM | disk | FTP | other *** search
- /* This programs convert mail files in the "BM" format to the new mail
- file format.
- Link object with files.obj, misc.obj and dirutil.obj.
- */
- #include <stdio.h>
- #include "global.h"
- #include "files.h"
- static void convert __ARGS((char *dir));
- static int isarea __ARGS((char *area));
- static void areafile __ARGS((char *filename,char *area));
- static void mkdirs __ARGS((char *path));
-
- /* Takes optional subdirectory in /spool/mail to convert as argument.
- Defaults to /spool/mail
- */
- main(argc,argv)
- int argc;
- char *argv[];
- {
- char fname[256];
- sprintf(fname,"%s/mail",Newsdir);
- mkdirs(fname);
- mkdirs(Userdir);
- if(argc > 1)
- sprintf(fname,"%s/%s",Mailspool,argv[1]);
- else
- strcpy(fname,Mailspool);
- convert(fname);
- }
- static void
- convert(dir)
- char *dir;
- {
- char fname[256],buf[1024],line[20],fpath[256],dirstr[256],*cp;
- int msg, skip = 0;
- FILE *mfile = NULLFILE, *fp;
- printf("Scanning directory %s\n",dir);
- sprintf(dirstr,"%s/*",dir);
- filedir(dirstr,0,line);
- while(line[0] != '\0') {
- if(skip) {
- if(stricmp(line,buf) == 0)
- skip = 0;
- filedir(dirstr,1,line);
- continue;
- }
- if(strchr(line,'.') == NULLCHAR) { /* possible directory */
- /* doesn't work if filedir() doesn't operate on directories */
- sprintf(fname,"%s/%s",dir,line);
- strcpy(buf,line);
- skip = 1;
- convert(fname);
- filedir(dirstr,0,line);
- continue;
- }
- if(strlen(line) > 3 && stricmp(&line[strlen(line)-4],".txt") == 0) {
- sprintf(buf,"%s/%s",dir,line);
- if((fp = fopen(buf,READ_TEXT)) == NULLFILE) {
- filedir(dirstr,1,line);
- continue;
- }
- printf("Processing %s\n",buf);
- line[strlen(line)-4] = '\0';
- if(isarea(line) || stricmp(dir,Mailspool) != 0) {
- if(strlen(dir) > strlen(Mailspool)) {
- sprintf(buf,"%s.%s",&dir[strlen(Mailspool)+1],line);
- while((cp = strchr(buf,'/')) != NULLCHAR)
- *cp = '.';
- }
- else
- sprintf(buf,"%s",line);
- }
- else
- sprintf(buf,"mail.%s",line);
- areafile(fpath,buf);
- mkdirs(fpath);
- msg = 0;
- mfile = NULLFILE;
- while(fgets(buf,sizeof(buf),fp) != NULLCHAR) {
- if(strnicmp("From ",buf,5) == 0) {
- fclose(mfile);
- sprintf(fname,"%s/%u",fpath,++msg);
- if((mfile = fopen(fname,WRITE_TEXT)) == NULLFILE){
- printf("Can't write %s\n",fname);
- exit(1);
- }
- if((cp = strchr(buf+5,' ')) != NULLCHAR)
- *cp = '\0';
- fprintf(mfile,"Return-Path: %s\n",buf+5);
- }
- else
- fputs(buf,mfile);
- }
- fclose(mfile);
- fclose(fp);
- sprintf(buf,"%s/active",Newsdir);
- if((fp = fopen(buf,APPEND_TEXT)) == NULLFILE) {
- printf("Can't write %s\n",buf);
- exit(1);
- }
- if(isarea(line) || stricmp(dir,Mailspool) != 0) {
- if(strlen(dir) > strlen(Mailspool)) {
- sprintf(buf,"%s.%s",&dir[strlen(Mailspool)+1],line);
- while((cp = strchr(buf,'/')) != NULLCHAR)
- *cp = '.';
- }
- else
- strcpy(buf,line);
- fprintf(fp,"%s ",buf);
- }
- else
- fprintf(fp,"mail.%s ",line);
- if(msg)
- fprintf(fp,"%u 1 y",msg);
- fprintf(fp,"\n");
- fclose(fp);
- }
- filedir(dirstr,1,line);
- }
- }
-
- /* Returns 1 if name is a public message Area, 0 otherwise */
- static int
- isarea(name)
- char *name;
- {
- char buf[1024], *cp;
- FILE *fp;
- if((fp = fopen(Arealist,READ_TEXT)) == NULLFILE)
- return 0;
- while(fgets(buf,sizeof(buf),fp) != NULLCHAR) {
- /* The first word on each line is all that matters */
- if((cp = strchr(buf,' ')) == NULLCHAR)
- if((cp = strchr(buf,'\t')) == NULLCHAR)
- continue;
- *cp = '\0';
- if((cp = strchr(buf,'\t')) != NULLCHAR)
- *cp = '\0';
- if(stricmp(name,buf) == 0) { /* found it */
- fclose(fp);
- return 1;
- }
- }
- fclose(fp);
- return 0;
- }
-
- static void
- areafile(filename,area)
- char *filename;
- char *area;
- {
- FILE *fp;
- char buf[1024], *cp;
- static char *delim = " \t\n";
- if((fp = fopen(Pointerfile,READ_TEXT)) != NULLFILE){
- while(fgets(buf,sizeof(buf),fp) != NULLCHAR){
- if((cp = strtok(buf,delim)) == NULLCHAR)
- continue;
- if(stricmp(cp,area) == 0 &&
- (cp = strtok(NULLCHAR,delim)) != NULLCHAR){
- strcpy(filename,cp);
- fclose(fp);
- return;
- }
- }
- fclose(fp);
- }
- strcpy(buf,area);
- while((cp = strchr(buf,'.')) != NULLCHAR)
- *cp = '/';
- sprintf(filename,"%s/%s",Newsdir,buf);
- }
- static void
- mkdirs(path)
- char *path;
- {
- char *cp, buf[128];
- strcpy(buf,path);
- if(path[strlen(path)-1] != '/')
- strcat(buf,"/");
- cp = buf;
- while((cp = strchr(cp,'/')) != NULLCHAR) {
- *cp = '\0';
- #ifdef UNIX
- mkdir(buf,0755);
- #else
- mkdir(buf);
- #endif
- *cp++ = '/';
- }
- }
-
- #ifdef UNIX
- #include <sys/types.h>
- #include <dirent.h>
- /* wildcard filename lookup */
- filedir(name, times, ret_str)
- char *name;
- int times;
- char *ret_str;
- {
- static char dname[128], fname[128];
- static DIR *dirp = NULL;
- struct dirent *dp;
- char *cp, temp[128];
-
- /*
- * Make sure that the NULL is there in case we don't find anything
- */
- ret_str[0] = '\0';
-
- if (times == 0) {
- /* default a null name to *.* */
- if (name == NULL || *name == '\0')
- name = "*.*";
- /* split path into directory and filename */
- if ((cp = strrchr(name, '/')) == NULL) {
- strcpy(dname, ".");
- strcpy(fname, name);
- } else {
- strcpy(dname, name);
- dname[cp - name] = '\0';
- strcpy(fname, cp + 1);
- /* root directory */
- if (dname[0] == '\0')
- strcpy(dname, "/");
- /* trailing '/' */
- if (fname[0] == '\0')
- strcpy(fname, "*.*");
- }
- /* close directory left over from another call */
- if (dirp != NULL)
- closedir(dirp);
- /* open directory */
- if ((dirp = opendir(dname)) == NULL) {
- printf("Could not open DIR (%s)\n", dname);
- return;
- }
- } else {
- /* for people who don't check return values */
- if (dirp == NULL)
- return;
- }
-
- /* scan directory */
- while ((dp = readdir(dirp)) != NULL) {
- /* test for name match */
- /* if (wildmat(dp->d_name, fname)) {*/
- if (!strcmp(dp->d_name, fname) || (fname[0] == '*' &&
- !strcmp(&dp->d_name[strlen(dp->d_name) - strlen(fname)+1],
- &fname[1]))) { /* ...when we do not use wildmat */
- /* test for regular file */
- sprintf(temp, "%s/%s", dname, dp->d_name);
- strcpy(ret_str, dp->d_name);
- break;
- }
- }
-
- /* close directory if we hit the end */
- if (dp == NULL) {
- closedir(dirp);
- dirp = NULL;
- }
- }
- #endif
-